/**
 * @file
 * @author dousha
 * @date 2020
 */
.thumb
.syntax unified

.section .text.PendingServiceHandler
.type  pending_service_handler, %function
.extern currentTask
.global pending_service_handler

/**
 * 可挂起系统调用处理程序。
 *
 * 用于进行任务切换。
 *
 * @invokedBy{startup.s}
 */
pending_service_handler:
	ldr r3, =currentTask
	ldr r2, [r3]
	mrs r0, psp
	isb

	stmdb r0!, {r4-r11,lr}
	str r0, [r2] // r2[0] = r0
	// TODO: 如果任务指示使用了浮点单元，那么也要保存和恢复浮点单元

	stmdb sp!, {r0, r3}
	
	mov r0, #0x10
	msr basepri, r0
	dsb
	isb
	bl task_switch
	mov r0, #0x0
	msr basepri, r0
	
	ldmia sp!, {r0, r3}

	ldr r2, [r3]
	ldr r0, [r2]
	ldmia r0!, {r4-r11,lr}
	msr psp, r0
	isb
	bx lr
